package ia.programas.controlpc;
/**
 * 
 * @author Armando Andini
 *
 */
public class MapaTerreno {
	protected int LIBRE = 0;
	protected int OCUPADO = 1;
	
	protected int[][] mapa;
	protected int filas = 10;
	protected int columnas = 10;
	protected float tamCelda = 5;//long. lado de una celda(en cm)
	protected int robotX = 0; //X de la celda en q esta el robot
	protected int robotY = 0; // Y de la celda en q esta el robot
	protected float robotAngle = 90;
	
	/**
	 * 
	 * @param ancho cantidad de celdas en X
	 * @param alto cantidad de celdas en Y
	 */
	public MapaTerreno(int ancho,int alto){
		this.filas = alto;
		this.columnas = ancho;
		this.regenerar();
	}
	
	public void regenerar(){
		mapa = new int[filas][columnas];
		
		//setear todos como libres
		for(int i = 0;i<filas;i++){
			for(int j  = 0;j<columnas;j++){
				mapa[i][j] = LIBRE;
			}
		}
		
		robotX = 0;
		robotY = 0;
		robotAngle = 90;
	}
	
	public void setFilas(int filas){
		this.filas = filas;
		regenerar();
	}
	
	public void setColumnas(int columnas){
		this.columnas = columnas;
		regenerar();
	}
	
	public void setTamCelda(float tamCelda){
		this.tamCelda = tamCelda;
		regenerar();
	}
	
	/**
	 * dada la posicion real del robot, setea la celda correspondiente como posicion del robot.
	 */
	public void actCeldaRobot(float posRealX,float posRealY){
		int tempRobotX = (int)(posRealX/tamCelda);
		int tempRobotY = (int)(posRealY/tamCelda);
		if(tempRobotX < columnas && tempRobotY < filas){
			this.robotX = tempRobotX;
			this.robotY = tempRobotY;
		}
	}
	
	public void setRobotAngle(float ang){
		this.robotAngle = ang;
	}
	
	public void liberar(int x,int y){
		if(x < columnas && y<filas){
			mapa[y][x]=LIBRE;
		}
	}
	
	public void ocupar(int x,int y){
		if(x < columnas && y<filas){
			mapa[y][x]=OCUPADO;
		}
	}
	
	public int getColumnas(){
		return columnas;
	}
	
	public int getFilas(){
		return filas;
	}
	
	public int getRobotX(){
		return robotX;
	}
	
	public int getRobotY(){
		return robotY;
	}
	
	public float getRobotAngle(){
		return robotAngle;
	}
	
	
	public int getEstadoCelda(int x, int y){
		if(x < columnas && y<filas){
			return mapa[y][x];
		}
		else
			throw new RuntimeException("consulta celda fuera de rango. x="+x+" y="+y+" columnas="+columnas+" filas="+filas);
	}
}
